package com.yuju.group.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yuju.common.core.dao.IBaseDao;
import com.yuju.common.core.service.AbstractBaseService;
import com.yuju.enums.SeqCodeEnum;
import com.yuju.exception.BusinessException;
import com.yuju.group.dao.IEmployeeDao;
import com.yuju.group.dao.entity.Employee;
import com.yuju.group.enums.EmployeeReturnCodeEnum;
import com.yuju.group.model.DepartmentModel;
import com.yuju.group.model.EmployeeModel;
import com.yuju.group.model.HotelModel;
import com.yuju.group.service.ICodeGenService;
import com.yuju.group.service.IDepartmentService;
import com.yuju.group.service.IEmployeeService;
import com.yuju.group.service.IHotelService;
import com.yuju.login.model.OpModel;
import com.yuju.login.service.IOpService;
import com.yuju.model.TreeModel;
import com.yuju.util.Utils;

/**
 * 
 * 类名：EmployeeServiceImpl  <br />
 *
 * 功能：
 *
 * @author : zhousc <br />
 * @Date : 2017年11月27日 上午10:33:53  <br />
 * @version : 1.1 <br />
 */
@Service
public class EmployeeServiceImpl extends AbstractBaseService<EmployeeModel, Employee, String> implements IEmployeeService{

	@Autowired
	private IEmployeeDao employeeDao;
	@Autowired
	private IDepartmentService departmentService;
	@Autowired
	private IHotelService hotelService;
	@Autowired
	private ICodeGenService codeGenService;
	
	@Autowired
	private IOpService opService;
	
	@Override
	public IBaseDao<EmployeeModel, Employee, String> getDao() {
		// TODO Auto-generated method stub
		return employeeDao;
	}
	
	/**
	 * 
	 * 功能: <br/>员工新增
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年11月24日 上午11:30:26<br/>
	 * 
	 * @param employeeModel
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#save(java.lang.Object)
	 */
	@Override
	public int save(EmployeeModel employeeModel){
		employeeModel.setId(Utils.getUUID());
		employeeModel.setGmtCreate(new Date());
		employeeModel.setGmtModified(new Date());
		DepartmentModel findById = departmentService.findById(employeeModel.getDepartmentId());
		employeeModel.setHotelId(findById.getHotelId());
		//员工编号
		employeeModel.setCode(codeGenService.generate(employeeModel.getGroupId(), null,null,SeqCodeEnum.EMP_CODE.getCode()));
		return this.getDao().saveSelective(employeeModel);
	}
	
	/**
	 * 
	 * 功能: <br/>员工更新
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年11月24日 上午11:30:44<br/>
	 * 
	 * @param employeeModel
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#updateSelective(java.lang.Object)
	 */
	
	@Override
	public int updateSelective(EmployeeModel employeeModel){
		employeeModel.setGmtModified(new Date());
		return this.getDao().updateSelective(employeeModel);
	}
	
	/**
	 * 
	 * 功能: <br/> 获取本集团内最大的员工号，加1返回本集团最新的员工编号 展示到员工添加页面
	 * 
	 * 重写：zhouzhou <br/>
	 * 
	 * @Date ：2017年11月24日 下午2:57:35<br/>
	 * 
	 * @param groupId
	 * @return <br/>
	 * @see com.yuju.group.service.IEmployeeService#getEmpCode(java.lang.String)
	 */
//	@Override
//	public String getEmpCode(String groupId){
//		String employeeCode = codeGenService.generate(groupId, null,null,SeqCodeEnum.EMP_CODE.getCode());
//		return employeeCode;
//	}
	/**
	 * 
	 * 功能: <br/>编辑页面部门树的获取
	 * 
	 * 重写：zhouzhou <br/>
	 * 
	 * @Date ：2017年11月24日 下午4:32:17<br/>
	 * 
	 * @param groupId
	 * @return <br/>
	 * @see com.yuju.group.service.IEmployeeService#getDepartmentTree(java.lang.String)
	 */
	@Override
	public List<TreeModel> getDepartmentTree(String groupId){
		//定义一个list 用作装载返回值
		List<TreeModel> returnList = new ArrayList<>();
		//获取本集团下所有分店
		HotelModel hotelModel = new HotelModel();
		hotelModel.setGroupId(groupId);
		List<HotelModel> hotelList = hotelService.list(hotelModel);
		//遍历分店
		for(int i = 0; i < hotelList.size(); i++){
			//根据分店ID查询所属部门
			DepartmentModel departmentModel = new DepartmentModel();
			departmentModel.setHotelId(hotelList.get(i).getId());
			List<DepartmentModel> departmentList = departmentService.list(departmentModel);
			
			//新建一个装载分店及所属分店的TreeModel
			TreeModel hotelTreeModel = new TreeModel();
			//新建一个装载每个分店下部门的集合
			List<TreeModel> departmentTreeModelList = new ArrayList<>();
			//遍历部门信息对应装载到TreeModel里
			for(int z = 0; z < departmentList.size(); z++){
				TreeModel departmentTreeModel = new TreeModel();
				departmentTreeModel.setId(departmentList.get(z).getId());
				departmentTreeModel.setLabel(departmentList.get(z).getName());
				departmentTreeModel.setPid("1");
				departmentTreeModelList.add(departmentTreeModel);
			}
			hotelTreeModel.setId(hotelList.get(i).getId());
			hotelTreeModel.setLabel(hotelList.get(i).getName());
			hotelTreeModel.setPid("0");
			hotelTreeModel.setChildren(departmentTreeModelList);
			returnList.add(hotelTreeModel);
		}
		return returnList;
	}

	/**
	 * 
	 * 功能:个人中心，回显个人资料 <br/>
	 * 
	 * 重写：zhousc <br/>
	 * 
	 * @Date ：2017年12月8日 上午10:56:48<br/>
	 * 
	 * @param opId
	 * @return <br/>
	 * @see com.yuju.group.service.IEmployeeService#getEmpInfo(java.lang.String)
	 */
	@Override
	public EmployeeModel getEmpInfo(String opId) {
		return convert(employeeDao.getEmpInfo(opId));
	}
	
	/**
	 * 
	 * 功能: 删除员工<br/>
	 * 
	 * 重写：xuehj <br/>
	 * 1.检查该员工是否有对应的账号
	 * 2.如有对应账号信息，则提示不能删除
	 * 3.如果没有设置账号信息，则可删除
	 * @Date ：2018年1月25日 下午3:38:00<br/>
	 * 
	 * @param id
	 * @return <br/>
	 * @see com.yuju.common.core.service.AbstractBaseService#del(java.lang.Object)
	 */
	@Override
	public int del(String id) {
		OpModel param = new OpModel();
		param.setUserId(id);
		param.setEmpId(id);
		// 1.查询对应账号信息
		Integer rows = opService.getCount(param);
		// 2.如果有对应账号，则提示不可删除
		if (Utils.isNotNull(rows) && rows > 0) {
			throw new BusinessException(EmployeeReturnCodeEnum.EMPLOYEE_DEL_FAILURE_BY_OP.getCode(), EmployeeReturnCodeEnum.EMPLOYEE_DEL_FAILURE_BY_OP.getDesc());
		}
		// 3.如果没有设置账号信息，则可删除
		return del(id);
	}
	
}
